适配器模式
1. 知识点
- 适配器模式定义
- 适配器模式类图
- 适配器模式示例
- 适配器模式应用
顾名思义,适配器模式(Adapter Pattern)当然是用来适配的啦。当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了。
2. 类图
3. 示例代码
在国内的家中只能用国标接口进行充电。
// 国标插头
public interface CnPluginInterface {
void chargeWith2Pins();
}
// 实现国标插座的充电方法
public class CnPlugin implements CnPluginInterface {
public void chargeWith2Pins() {
System.out.println("charge with CnPlugin");
}
}
// 在国内家中充电
public class Home {
private CnPluginInterface cnPlugin;
public Home() { }
public Home(CnPluginInterface cnPlugin) {
this.cnPlugin = cnPlugin;
}
public void setPlugin(CnPluginInterface cnPlugin) {
this.cnPlugin = cnPlugin;
}
// 充电
public void charge() {
// 国标充电
cnPlugin.chargeWith2Pins();
}
}
// 国标测试类
public class CnTest {
public static void main(String[] args) {
CnPluginInterface cnPlugin = new CnPlugin();
Home home = new Home(cnPlugin);
// 会输出 “charge with CnPlugin”
home.charge();
}
}
然而,当把 iPhone6 带回来时,因为与家里的插座不匹配,所以需要一个适配器。这个适配器必须满足以下条件:
- 插头必须符合国内标准的接口,否则的话还是没办法插到国内插座中。
- 在调用上面实现的国标接口进行充电时,提供一种机制,将这个调用转到对英标接口的调用 。
这就要求:
- 适配器必须实现原有的旧的接口。
- 适配器对象中持有对新接口的引用,当调用旧接口时,将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。
// 英标插头
public interface EnPluginInterface {
void chargeWith3Pins();
}
// 实现英标插座的充电方法
public class EnPlugin implements EnPluginInterface {
public void chargeWith3Pins() {
System.out.println("charge with EnPlugin");
}
}
//适配器
public class PluginAdapter implements CnPluginInterface {
private EnPluginInterface enPlugin;
public PluginAdapter(EnPluginInterface enPlugin) {
this.enPlugin = enPlugin;
}
// 这是重点,适配器实现了国标的插头,然后重写国标的充电方法,在国标的充电方法中调用英标的充电方法
@Override
public void chargeWith2Pins() {
enPlugin.chargeWith3Pins();
}
}
// 适配器测试类
public class AdapterTest {
public static void main(String[] args) {
EnPluginInterface enPlugin = new EnPlugin();
Home home = new Home();
PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);
home.setPlugin(pluginAdapter);
// 会输出 “charge with EnPlugin”
home.charge();
}
}
这样就实现了对 iphone6 进行充电。
4. 应用
前面已经说了,当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了,其主要作用就是在旧的接口、新的接口之间完成适配。
比如说,做过 Android 的同学肯定写 ListView 的适配器都写吐了吧...
适配器模式的三个特点:
- 适配器对象实现原有接口
- 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
- 对适配器原有接口方法的调用被委托给新接口的实例的特定方法